﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjetoJornada_Negocios.Negocio;
using Basicas;

namespace ProjetoJornada_Negocios.Fachada
{
    public class Fachada
    {
        #region Atributos
        private NegocioAluno negocioAluno;
        private NegocioCurso negocioCurso;
        private NegocioDesconto negocioDesconto;
        private NegocioInstrutor_Monitor negocioInstrutorMonitor;
        private NegocioJornada negocioJornada;
        private NegocioMatricula negocioMatricula;
        private NegocioTurma negocioTurma;
        private NegocioFormaPagamento negocioFormaPagamento;
        #endregion

        #region Instancia
        private static Fachada _instance;
        public static Fachada Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Fachada();
                }
                return _instance;
            }
        } 
        #endregion

        #region Construtor
        public Fachada()
        {
            this.negocioAluno = new NegocioAluno();
            this.negocioCurso = new NegocioCurso();
            this.negocioDesconto = new NegocioDesconto();
            this.negocioInstrutorMonitor = new NegocioInstrutor_Monitor();
            this.negocioJornada = new NegocioJornada();
            this.negocioTurma = new NegocioTurma();
            this.negocioMatricula = new NegocioMatricula();
            this.negocioFormaPagamento = new NegocioFormaPagamento();
        }
        #endregion

        #region Metodos Aluno
        public Boolean InserirAluno(Aluno aluno)
        {
            return this.negocioAluno.InserirAluno(aluno);
        }

        public Boolean RemoverAluno(String cpf)
        {
            return this.negocioAluno.RemoverAluno(cpf);
        }

        public Boolean EditarAluno(Aluno aluno)
        {
            return this.negocioAluno.EditarAluno(aluno);
        }

        public Aluno ConsultarAlunoPorCpf(String cpf)
        {
            return this.negocioAluno.ConsultarAlunoPorCpf(cpf);
        }

        public List<Aluno> ConsultarTodosAlunos()
        {
            return this.negocioAluno.ConsultarTodosAlunos();
        }

        public List<Aluno> ConsultarAlunoPorNome(String nome)
        {
            return this.negocioAluno.ConsultarAlunoPorNome(nome);
        }
        #endregion

        #region Metodos Curso
        public int InserirCurso(Curso curso)
        {
            return this.negocioCurso.InserirCurso(curso);
        }
        public Boolean RemoverCurso(Int32 idCurso)
        {
            return this.negocioCurso.RemoverCurso(idCurso);
        }
        public Boolean EditarCurso(Curso curso)
        {
            return this.negocioCurso.EditarCurso(curso);
        }
        public List<Curso> ConsultarTodosCursos()
        {
            return this.negocioCurso.ConsultarTodosCursos();
        }
        public Curso ConsultarCursoPorId(Int32 idCurso)
        {
            return this.negocioCurso.ConsultarCursoPorId(idCurso);
        }
        public Curso ConsultarCursoPorJornada(Int32 idJornada)
        {
            return this.negocioCurso.ConsultarCursoPorJornada(idJornada);
        }
        public byte[] ConsultarLogoCurso(int idCurso)
        {
            return negocioCurso.ConsultarLogo(idCurso);        
        }
        #endregion

        #region Metodos Desconto
        public int InserirDesconto(Desconto desconto)
        {
            return this.negocioDesconto.InserirDesconto(desconto);
        }

        public Boolean RemoverDesconto(Int32 idDesconto)
        {
            return this.negocioDesconto.RemoverDesconto(idDesconto);
        }

        public Boolean EditarDesconto(Desconto desconto)
        {
            return this.negocioDesconto.EditarDesconto(desconto);
        }

        public Desconto ConsultarDescontoPorId(Int32 idDesconto)
        {
            return this.negocioDesconto.ConsultarDescontoPorId(idDesconto);
        }

        public List<Desconto> ConsultarTodsDescontos()
        {
            return this.negocioDesconto.ConsultarTodsDescontos();
        }
        #endregion

        #region Metodos Forma De Pagamento
        public int InserirFormaDePagamento(FormaPagamento formaPagamento)
        {
            return negocioFormaPagamento.Inserir(formaPagamento);
        }

        public Boolean RemoverFormaDePagamento(int id)
        {
            return negocioFormaPagamento.Remover(id);
        }

        public Boolean EditarFormaPagamento(FormaPagamento formaPagamento)
        {
            return negocioFormaPagamento.Editar(formaPagamento);
        }

        public FormaPagamento ConsutarFormaPagamentoPorId(int id)
        {
            return negocioFormaPagamento.ConsultarFormaPagamentoPorId(id);
        }
        
        public List<FormaPagamento> GetTodasFormasPagamento()
        {
            return negocioFormaPagamento.GetTodasFormasPagamento();
        }
        #endregion

        #region Metodos Instrutor_Monitor
        public bool InserirInstrutorMonitor(Instrutor_Monitor instrutorMonitor)
        {
            return negocioInstrutorMonitor.Inserir(instrutorMonitor);
        }

        public Boolean RemoverInstrutorMonitor(String cpf)
        {
            try
            {
                return negocioInstrutorMonitor.Remover(cpf);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Boolean EditarInstrutorMonitor(Instrutor_Monitor instrutorMonitor)
        {
            return negocioInstrutorMonitor.Editar(instrutorMonitor);
        }

        public Instrutor_Monitor ConsultarInstrutorMonitorPorCPF(String cpf)
        {
            return negocioInstrutorMonitor.ConsultarInstrutorMonitorPorCPF(cpf);
        }

        public List<Instrutor_Monitor> GetInstrutorMonitorPorNome(String nome)
        {
            return negocioInstrutorMonitor.GetInstrutorMonitorPorNome(nome);
        }

        public List<Instrutor_Monitor> GetTodosInstrutorMonitor()
        {
            return negocioInstrutorMonitor.GetTodosInstrutorMonitor();
        }
        #endregion

        #region Metodos Jornada
        public int InserirJornada(Jornada jornada)
        {
            return this.negocioJornada.Inserir(jornada);
        }

        public Boolean RemoverJornada(int id)
        {
            return negocioJornada.Remover(id);
        }

        public Boolean EditarJornada(Jornada jornada)
        {
            return negocioJornada.Editar(jornada);
        }

        public Jornada ConsultarJornadaPorId(int id)
        {
            return negocioJornada.ConsultarJornadaPorId(id);
        }

        public double ConsultarFaturamento(int id)
        {
            return negocioJornada.ConsultarFaturamento(id);
        }

        public int ConsultarQuatidadeTotalDeAlunos(int id)
        {
            return negocioJornada.ConsultarQuatidadeTotalDeAlunos(id);
        }

        public void SetDefault(int id)
        {
            this.negocioJornada.SetDefault(id);
        }

        public int SelecionarUltimainserida()
        {
            return this.negocioJornada.SelecionarUltimainserida();
        }

        public List<Jornada> ConsultarTodasJornadas()
        {
            return this.negocioJornada.ConsultarTodasJornadas();
        }
        #endregion

        #region Metodos Matricula
        public Int32 InserirMatricula(Matricula matricula)
        {
            return this.negocioMatricula.Inserir(matricula);
        }
        public bool EditarMatricula(Matricula matricula)
        {
            return this.negocioMatricula.Editar(matricula);
        }
        public bool RemoverMatricula(Matricula matricula)
        {
            return this.negocioMatricula.Remover(matricula);      
        }

        public List<Matricula> BuscarMatriculaPorTurma(Turma turma)
        {
            return negocioMatricula.BuscarPorTurma(turma);
        }

        public Matricula BuscarMatriculaPorId(int matriculaId)
        {
                return negocioMatricula.BuscarPorId(matriculaId);
        }

        public List<Matricula> BuscarMatriculaPorCpf(string cpf)
        {
            return negocioMatricula.BuscarPorCpf(cpf);
        }

        public List<Matricula> ConsultarMatriculaPorCPFNaJornada(string cpf, int idJornada)
        {
            return this.negocioMatricula.ConsultarMatriculaPorCPFNaJornada(cpf, idJornada);
        }
        #endregion

        #region Metodos Turma
        public bool InserirTurma(Turma turma)
        {
            return this.negocioTurma.Inserir(turma);
        }
        public bool EditarTurma(Turma turma)
        {
            return this.negocioTurma.Editar(turma);
        }
        public bool RemoverTurma(Turma turma)
        {
            return this.negocioTurma.Remover(turma);
        }
        public Turma ConsultarTurmaPorId(int idTurma)
        {
            return negocioTurma.Consultar(idTurma);
        }
        public List<Turma> ConsultarTodasAsTurmasPorJornada(int idJornada)
        {
            return this.negocioTurma.ConsultarTodasAsTurmasPorJornada(idJornada);
        }
        public Int32 GetQuantidadeDeAlunosPorTurma(Turma turma)
        {
            return negocioTurma.GetQuantidadeDeAlunos(turma);
        }
        public Dictionary<int, int> GetQuantidadeDeAlunosEmTodasAsTurmas(int idJornada)
        {
            return negocioTurma.GetQuantidadeDeAlunosEmTodasAsTurmas(idJornada);        
        }
        #endregion

        public Boolean InserirAlunoMatriculas(Aluno aluno, List<Matricula> matriculas)
        {
            Boolean inserirAluno = false;
            Boolean inserirMatricula = true;
            Int32 idMatricula = 0;

            inserirAluno = this.InserirAluno(aluno);
            if (matriculas != null & matriculas.Count != 0)
            {
                foreach (Matricula matricula in matriculas)
                {
                    idMatricula = this.InserirMatricula(matricula);
                    if (idMatricula == 0)
                    {
                        inserirMatricula = false;
                    }
                }
            }
            return (inserirAluno && inserirMatricula);
        }


    }
}
